{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "regularized_evolution_algorithm.ipynb",
      "version": "0.3.2",
      "provenance": [],
      "collapsed_sections": []
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    }
  },
  "cells": [
    {
      "metadata": {
        "id": "46lPbgGTF2He",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "Copyright 2018 Google LLC\n",
        "\n",
        "Licensed under the Apache License, Version 2.0 (the \"License\");\n",
        "you may not use this file except in compliance with the License.\n",
        "You may obtain a copy of the License at\n",
        "\n",
        "    https://www.apache.org/licenses/LICENSE-2.0\n",
        "\n",
        "Unless required by applicable law or agreed to in writing, software\n",
        "distributed under the License is distributed on an \"AS IS\" BASIS,\n",
        "WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
        "See the License for the specific language governing permissions and\n",
        "limitations under the License."
      ]
    },
    {
      "metadata": {
        "id": "K_6EyDK_B3fI",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "# Summary"
      ]
    },
    {
      "metadata": {
        "id": "eizp75WbBwaB",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "This document contains the code of the regularized evolution (i.e. aging evolution) algorithm used in:\n",
        "\n",
        "[E. Real, A. Aggarwal, Y. Huang, and Q. V. Le 2018. Regularized Evolution for Image Classifier Architecture Search](https://arxiv.org/abs/1802.01548).\n",
        "\n",
        "It demonstrates the application of the algorithm in a toy search space that can be run quickly in a single machine."
      ]
    },
    {
      "metadata": {
        "id": "VUdox1uMAMqF",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "# Toy Search Space"
      ]
    },
    {
      "metadata": {
        "id": "YtacawXFAQbg",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "For a simple problem to use for illustration purposes, we use the toy search space of appendix C. In it, toy models have a simulated architecture (bit-string) and a simulated accuracy (the number of 1s in the bit-string, with some additional random noise), as described below."
      ]
    },
    {
      "metadata": {
        "id": "d0uYu1WisqLa",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "DIM = 100  # Number of bits in the bit strings (i.e. the \"models\").\n",
        "NOISE_STDEV = 0.01  # Standard deviation of the simulated training noise.\n",
        "\n",
        "class Model(object):\n",
        "  \"\"\"A class representing a model.\n",
        "  \n",
        "  It holds two attributes: `arch` (the simulated architecture) and `accuracy`\n",
        "  (the simulated accuracy / fitness). See Appendix C for an introduction to\n",
        "  this toy problem.\n",
        "  \n",
        "  In the real case of neural networks, `arch` would instead hold the\n",
        "  architecture of the normal and reduction cells of a neural network and\n",
        "  accuracy would be instead the result of training the neural net and\n",
        "  evaluating it on the validation set.\n",
        "  \n",
        "  We do not include test accuracies here as they are not used by the algorithm\n",
        "  in any way. In the case of real neural networks, the test accuracy is only\n",
        "  used for the purpose of reporting / plotting final results.\n",
        "\n",
        "  In the context of evolutionary algorithms, a model is often referred to as\n",
        "  an \"individual\".\n",
        "\n",
        "  Attributes:\n",
        "    arch: the architecture as an int representing a bit-string of length `DIM`.\n",
        "        As a result, the integers are required to be less than `2**DIM`. They\n",
        "        can be visualized as strings of 0s and 1s by calling `print(model)`,\n",
        "        where `model` is an instance of this class.\n",
        "    accuracy:  the simulated validation accuracy. This is the sum of the\n",
        "        bits in the bit-string, divided by DIM to produce a value in the\n",
        "        interval [0.0, 1.0]. After that, a small amount of Gaussian noise is\n",
        "        added with mean 0.0 and standard deviation `NOISE_STDEV`. The resulting\n",
        "        number is clipped to within [0.0, 1.0] to produce the final validation\n",
        "        accuracy of the model. A given model will have a fixed validation\n",
        "        accuracy but two models that have the same architecture will generally\n",
        "        have different validation accuracies due to this noise. In the context\n",
        "        of evolutionary algorithms, this is often known as the \"fitness\".\n",
        "  \"\"\"\n",
        "  def __init__(self):\n",
        "    self.arch = None\n",
        "    self.accuracy = None\n",
        "    \n",
        "  def __str__(self):\n",
        "    \"\"\"Prints a readable version of this bitstring.\"\"\"\n",
        "    return '{0:b}'.format(self.arch)\n",
        "  \n",
        "def train_and_eval(arch):\n",
        "  \"\"\"Simulates training and evaluation.\n",
        "  \n",
        "  Computes the simulated validation accuracy of the given architecture. See\n",
        "  the `accuracy` attribute in `Model` class for details.\n",
        "  \n",
        "  Args:\n",
        "    arch: the architecture as an int representing a bit-string.\n",
        "  \"\"\"\n",
        "  accuracy =  float(_sum_bits(arch)) / float(DIM)\n",
        "  accuracy += random.gauss(mu=0.0, sigma=NOISE_STDEV)\n",
        "  accuracy = 0.0 if accuracy < 0.0 else accuracy\n",
        "  accuracy = 1.0 if accuracy > 1.0 else accuracy\n",
        "  return accuracy\n",
        "\n",
        "def _sum_bits(arch):\n",
        "  \"\"\"Returns the number of 1s in the bit string.\n",
        "  \n",
        "  Args:\n",
        "    arch: an int representing the bit string.\n",
        "  \"\"\"\n",
        "  total = 0\n",
        "  for _ in range(DIM):\n",
        "    total += arch & 1\n",
        "    arch = (arch >> 1)\n",
        "  return total"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "f3SA6aWmArnW",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "# Search Space Traversal"
      ]
    },
    {
      "metadata": {
        "id": "jkNYKtGtAzUs",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "Below we define a function to generate random architectures in the basic search space and a function to mutate architectures within the search space."
      ]
    },
    {
      "metadata": {
        "id": "FXACEXwy201a",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "import random\n",
        "\n",
        "def random_architecture():\n",
        "  \"\"\"Returns a random architecture (bit-string) represented as an int.\"\"\"\n",
        "  return random.randint(0, 2**DIM - 1)\n",
        "\n",
        "def mutate_arch(parent_arch):\n",
        "  \"\"\"Computes the architecture for a child of the given parent architecture.\n",
        "\n",
        "  The parent architecture is cloned and mutated to produce the child\n",
        "  architecture. The child architecture is mutated by flipping a randomly chosen\n",
        "  bit in its bit-string.\n",
        "\n",
        "  Args:\n",
        "    parent_arch: an int representing the architecture (bit-string) of the\n",
        "        parent.\n",
        "\n",
        "  Returns:\n",
        "    An int representing the architecture (bit-string) of the child.\n",
        "  \"\"\"\n",
        "  position = random.randint(0, DIM - 1)  # Index of the bit to flip.\n",
        "  \n",
        "  # Flip the bit at position `position` in `child_arch`.\n",
        "  child_arch = parent_arch ^ (1 << position)\n",
        "  \n",
        "  return child_arch"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "T2ciQCkqBSDe",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "# Regularized Evolution Algorithm"
      ]
    },
    {
      "metadata": {
        "id": "aHxYBucT-x5R",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "The regularized evolution (i.e. aging evolution) algorithm can be written as:"
      ]
    },
    {
      "metadata": {
        "id": "6dr709ay2ahZ",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "import collections\n",
        "import random\n",
        "\n",
        "def regularized_evolution(cycles, population_size, sample_size):\n",
        "  \"\"\"Algorithm for regularized evolution (i.e. aging evolution).\n",
        "  \n",
        "  Follows \"Algorithm 1\" in Real et al. \"Regularized Evolution for Image\n",
        "  Classifier Architecture Search\".\n",
        "  \n",
        "  Args:\n",
        "    cycles: the number of cycles the algorithm should run for.\n",
        "    population_size: the number of individuals to keep in the population.\n",
        "    sample_size: the number of individuals that should participate in each\n",
        "        tournament.\n",
        "\n",
        "  Returns:\n",
        "    history: a list of `Model` instances, representing all the models computed\n",
        "        during the evolution experiment.\n",
        "  \"\"\"\n",
        "  population = collections.deque()\n",
        "  history = []  # Not used by the algorithm, only used to report results.\n",
        "\n",
        "  # Initialize the population with random models.\n",
        "  while len(population) < population_size:\n",
        "    model = Model()\n",
        "    model.arch = random_architecture()\n",
        "    model.accuracy = train_and_eval(model.arch)\n",
        "    population.append(model)\n",
        "    history.append(model)\n",
        "\n",
        "  # Carry out evolution in cycles. Each cycle produces a model and removes\n",
        "  # another.\n",
        "  while len(history) < cycles:\n",
        "    # Sample randomly chosen models from the current population.\n",
        "    sample = []\n",
        "    while len(sample) < sample_size:\n",
        "      # Inefficient, but written this way for clarity. In the case of neural\n",
        "      # nets, the efficiency of this line is irrelevant because training neural\n",
        "      # nets is the rate-determining step.\n",
        "      candidate = random.choice(list(population))\n",
        "      sample.append(candidate)\n",
        "\n",
        "    # The parent is the best model in the sample.\n",
        "    parent = max(sample, key=lambda i: i.accuracy)\n",
        "\n",
        "    # Create the child model and store it.\n",
        "    child = Model()\n",
        "    child.arch = mutate_arch(parent.arch)\n",
        "    child.accuracy = train_and_eval(child.arch)\n",
        "    population.append(child)\n",
        "    history.append(child)\n",
        "\n",
        "    # Remove the oldest model.\n",
        "    population.popleft()\n",
        "\n",
        "  return history"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "0ptMGABxBV61",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "# Example Run on the Toy Search Space"
      ]
    },
    {
      "metadata": {
        "id": "ykQshJgS-1W1",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "We run the algorithm for 1000 samples, setting the population size and sample size parameters to reasonable values."
      ]
    },
    {
      "metadata": {
        "id": "1izV1iKqFSgS",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "history = regularized_evolution(\n",
        "    cycles=1000, population_size=100, sample_size=10)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "5YUKkL0_-UMH",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "We plot the progress of the experiment, showing how the accuracy improved gradually:"
      ]
    },
    {
      "metadata": {
        "id": "ZXKj2rddziLV",
        "colab_type": "code",
        "outputId": "3ea1d3a6-134d-433a-d6a9-178d8f9f7d88",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 445
        }
      },
      "cell_type": "code",
      "source": [
        "import matplotlib.pyplot as plt\n",
        "import matplotlib.ticker as ticker\n",
        "import seaborn as sns\n",
        "sns.set_style('white')\n",
        "xvalues = range(len(history))\n",
        "yvalues = [i.accuracy for i in history]\n",
        "ax = plt.gca()\n",
        "ax.scatter(\n",
        "    xvalues, yvalues, marker='.', facecolor=(0.0, 0.0, 0.0),\n",
        "    edgecolor=(0.0, 0.0, 0.0), linewidth=1, s=1)\n",
        "ax.xaxis.set_major_locator(ticker.LinearLocator(numticks=2))\n",
        "ax.xaxis.set_major_formatter(ticker.ScalarFormatter())\n",
        "ax.yaxis.set_major_locator(ticker.LinearLocator(numticks=2))\n",
        "ax.yaxis.set_major_formatter(ticker.ScalarFormatter())\n",
        "fig = plt.gcf()\n",
        "fig.set_size_inches(8, 6)\n",
        "fig.tight_layout()\n",
        "ax.tick_params(\n",
        "    axis='x', which='both', bottom='on', top='off', labelbottom='on',\n",
        "    labeltop='off', labelsize=14, pad=10)\n",
        "ax.tick_params(\n",
        "    axis='y', which='both', left='on', right='off', labelleft='on',\n",
        "    labelright='off', labelsize=14, pad=5)\n",
        "plt.xlabel('Number of Models Evaluated', labelpad=-16, fontsize=16)\n",
        "plt.ylabel('Accuracy', labelpad=-30, fontsize=16)\n",
        "plt.xlim(0, 1000)\n",
        "sns.despine()"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkIAAAGsCAYAAAAxAchvAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzs3Xd8FHX+P/DXJoDo0YLiKYET1B8J\nEHY3cgoqNkCKEJWQRD3hrAiciKJwSBCQFlDAwmHBcnJnIaQgGsCj2buQLQqoXytBEfEgYFQMZD+/\nP3T2Zmdndmd2Z7a+no8HjyO7Uz67cM6L96fZhBACRERERGkoI94NICIiIooXBiEiIiJKWwxCRERE\nlLYYhIiIiChtMQgRERFR2mIQIiIiorTFIERERERpS1cQ2rNnD8aNG4c+ffrgggsuwJw5c9DY2Kh6\n7NNPP40hQ4bA4XBgxIgRcLvd/vd8Ph8efvhhDBw4EPn5+SgsLMRrr73mf3/06NHo0aMHevXq5f81\nbNgw//s7d+7ENddcgzPPPBNnn302Jk6ciG+//TbSz05ERERpTlcQmjBhArKysrBp0yY899xzcLlc\nWLp0adBxa9aswX333Yc5c+bggw8+wOjRozF27FgcOnQIALBixQqUl5dj2bJleP/993H55Zfjlltu\nwXfffee/xvjx4/Hhhx/6f61btw4AcPToUYwZMwa9evXCW2+9hY0bNwIAJk+eHPWXQEREROkpbBD6\n8MMPsWPHDkyZMgVt2rRBdnY2xo4di4qKCvh8voBjX375ZQwePBhnnXUWWrRogcLCQpx++unYsGHD\nbzfLyMDUqVORm5uL5s2bY/To0QAAr9cbtqF79uzBvn37MGLECLRo0QKtW7fGJZdcgp07d0byuYmI\niIjCB6Ht27fj5JNPRvv27f2v9ezZEwcPHsSuXbuCjrfZbAE/t2nTxh9Wrr322oCurh9++AFHjhzB\nH//4R/9r7777Li699FLk5+fj6quvxueffw4AyM7ORm5uLsrLy9HQ0ICGhgasX78e/fv3V2330aNH\nsXv3bhw9ejTcRyQiIqI0FTYI1dfXo02bNgGvtW3bFgBw4MCBgNcvuugi/Oc//8EHH3yAxsZGvPLK\nK9i2bRvq6+uDrtvU1ITp06fjnHPOgcPhAACcdtppOO200/DUU0/h1VdfRXZ2NsaMGYNff/0VGRkZ\nWLZsGV5++WX07t0bvXv3xrfffotZs2aptvu7777DgAEDArrdiIiIiOR0jRHSuy/r5ZdfjjFjxmDq\n1Kk499xzsWnTJgwbNgzNmjULOO6XX37BzTffjB9++AH33Xef//W7774bc+bMwfHHH4+2bdti5syZ\n2Lt3L95//300NjZi3LhxGDx4MLZu3YrXX38dJ554Iu644w4DH5eIiIjof5qFO6B9+/ZBFR3p5+OP\nPz7gdZvNhr/97W/429/+5n9t4sSJ6NKli//ngwcP4oYbbkDbtm3x73//G61atdK8d6tWrdC2bVt8\n//33eOedd/D1119j0qRJaN68OVq3bo2JEyfisssuw3//+9+gthARERGFE7YilJeXh71792Lfvn3+\n17xeL44//nh07tw54Ngvv/wSmzdv9v/c2NiIDz74AL179/b/PHbsWJxyyilYvnx5QAhqaGjA3Xff\njb179/pf279/P/bv34/OnTujqakpqDLF8T9EREQUjbBBqEePHnA6nVi0aBF+/PFH1NXV4ZFHHsHV\nV18Nm82GIUOG4L333gMAfP/997j99tvhcrnQ2NiIe++9FyeccAL69esHAHjqqadw9OhR3HPPPUHd\nZa1atYLH48G8efNQX1+PgwcPYvbs2ejWrRv+/Oc/Iz8/H61atcIDDzyAn3/+GQcOHMCjjz6K/Px8\nVoOIiIgoIrrGCD344IM4dOgQzjvvPBQXF+P888/HuHHjAPxWBfr5558BAH369MFtt92GW265BWed\ndRa+/PJLPProo8jMzAQAVFZWYufOncjPzw9YNPHhhx8GADz00EMQQmDw4MG48MILceTIETz++OPI\nyMhAVlYWnnzySXi9XlxwwQUYNmwYMjMz8cADD1jxvRAREVEasAm9I6GTzO7duzFgwABs2bIFnTp1\nindziIiIKAFxrzEiIiJKWwxCRERElLYYhIiIiChtMQgRERFR2mIQIiIiorTFIERERERpi0GIiIiI\n0haDEBEREaUtBiEiIiJKWwxCRERElLYYhIiIiMgyQgi43W4k6o5eDEJERERkGY/Hg5EjR8Lj8cS7\nKaoYhIiIiMgyDocD1dXVcDgc8W6KKgYhIiIisozNZoPT6YTNZvO/lkjdZQxCREREFFOJ1F3GIERE\nREQxlUjdZc3i3QAiIiJKL1J3WSJgRYiIiIjSFoMQERERpS0GISIiIkpbDEJERESUthiEiIiIKCYS\n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\niChtMQgRERFR2mIQIiIiorTFIERERERpi0GIiIiI0haDEBEREaUtBqEocTNWIiKi5MUgFCVuxkpE\nRJS8GISixM1YiYiIkhc3XY0SN2MlIiJKXqwIERERUdpiECIiIqK0xSBEREREaYtBiIiIiNIWgxAR\nERGlLQah33FhRCIiovTDIPQ7LoxIRESUfhiEfseFEYmIiNIPg9DvpIURbTZbzO7J7jgiIqL4YhCK\nI3bHERERxReDUByxO46IiCi+uNdYHHGfMiIiovhiRYiIiIjSFoMQERERpS0GISIiIkpbDEJERESU\nthiEiIiIKG0xCBEREVHaYhAiIiKitMUgRERERGmLQYiIiIjSFoMQERERpS0GISIiIkpbuoLQnj17\nMG7cOPTp0wcXXHAB5syZg8bGRtVjn3zySQwcOBBOpxODBg3CP//5T9Xjtm/fjh49emD16tWq7//r\nX/9CTk4Odu/e7X/t1VdfRWFhIfLz83H++edj5syZaGho0PMRiIiIiILoCkITJkxAVlYWNm3ahOee\new4ulwtLly4NOq6yshIrVqzAsmXLUFtbi/nz5+OBBx7A5s2bA47z+XyYNWsWjjvuONX77d27F089\n9VTAa59//jkmTpyIMWPGYOvWrXj22WexdetWPPjgg3o/KxEREVGAsEHoww8/xI4dOzBlyhS0adMG\n2dnZGDt2LCoqKuDz+QKO7dq1K+677z7k5uYiIyMDZ555Jk477TR8/PHHAcetXLkSbdq0Qffu3VXv\nOX/+fFx55ZUBrzVr1gwLFy7E0KFDkZmZic6dO+O8884LujYRERGRXs3CHbB9+3acfPLJaN++vf+1\nnj174uDBg9i1axe6dOnif/3Pf/6z//eNjY3YvHkz6urq0L9/f//r+/btw0MPPYRnn30WM2fODLrf\na6+9hk8//RSLFy/G/fff73/9lFNOwSmnnALgt4rSRx99hE2bNmHMmDGq7W5qagIAfPfdd+E+IhER\nESWBk046Cc2ahY0uhoS9Wn19Pdq0aRPwWtu2bQEABw4cCAhCknvuuQdPPfUU2rdvj4ULF6JHjx7+\n9xYsWIArr7wSXbt2DTrv8OHDmDt3LubNm4cWLVqotufll1/GhAkTkJGRgXHjxuGqq65SPW7fvn0A\ngKuvvjrcRyQiIqIksGXLFnTq1MnUa+qKVUIIQxedOnUqJk2ahNdffx3Tp09HRkYG+vfvj7feegvb\n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\n",
            "text/plain": [
              "<matplotlib.figure.Figure at 0x7f9b79548eb8>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "metadata": {
        "id": "nWvlb_hnJt7U",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        ""
      ],
      "execution_count": 0,
      "outputs": []
    }
  ]
}
